// AccountDatabase.java
package com.hwpt.hwaccount.core.data.local.database;

import android.content.Context;
import android.util.Log;

import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import com.hwpt.hwaccount.core.data.local.dao.UserDao;
import com.hwpt.hwaccount.core.data.local.entity.UserEntity;
import com.hwpt.hwaccount.core.utils.SecurityUtils;

import net.sqlcipher.database.SupportFactory;

/**
 * Room 数据库抽象类，用于管理用户数据存储
 * <p>
 * 使用 SQLCipher 对数据库进行加密，提供单例访问模式确保全局唯一实例。
 * 包含用户实体 {@link UserEntity} 的数据库表定义和访问接口。
 * </p>
 *
 * @see Database Room 数据库注解
 * @see RoomDatabase Room 数据库基类
 */
@Database(entities = {UserEntity.class}, version = 1, exportSchema = false)
public abstract class UserInfoDB extends RoomDatabase {
    private static volatile UserInfoDB INSTANCE; // 单例实例

    /**
     * 获取用户数据访问对象 (DAO)
     * @return {@link UserDao} 实例，用于操作用户表
     */
    public abstract UserDao userDao();

    /**
     * 获取数据库单例实例（线程安全）
     * <p>
     * 使用双重检查锁定模式保证线程安全，并通过 SQLCipher 加密数据库文件。
     * 首次创建时会从 {@link SecurityUtils} 获取加密密钥。
     * </p>
     *
     * @param context Android 上下文对象
     * @return 数据库单例实例
     */
    public static UserInfoDB getInstance(Context context) {
        if (INSTANCE == null) {
            synchronized (UserInfoDB.class) {
                if (INSTANCE == null) {
                    // 从安全工具类获取数据库加密密钥
                    final byte[] passphrase = SecurityUtils.getDatabasePassphrase(context);
                    // 创建 SQLCipher 支持工厂
                    final SupportFactory factory = new SupportFactory(passphrase);

                    // 构建数据库实例
                    INSTANCE = Room.databaseBuilder(
                            context.getApplicationContext(),
                            UserInfoDB.class,
                            "account.db" // 数据库文件名
                    )
                            //.openHelperFactory(factory) // 设置 SQLCipher 加密
                            .fallbackToDestructiveMigration() // 数据库版本冲突时重建表
                            .build();
                }
                String dbPath = context.getDatabasePath("account.db").getAbsolutePath();
                Log.e("DB_PATH", "数据库路径: " + dbPath);
            }
        }
        return INSTANCE;
    }
}